/*
 * @Author: zhuzhiqiang zhuzq@neuray.cn
 * @Date: 2025-02-26 11:10:02
 * @LastEditors: 朱自强
 * @LastEditTime: 2025-02-27 09:41:44
 * @FilePath: \vue3-element-admin\src\store\modules\permission.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import type { RouteRecordRaw } from "vue-router";
import { constantRoutes } from "@/router";
import { store } from "@/store";
import router from "@/router";
import MenuAPI, { type RouteVO } from "@/api/system/menu";
const modules = import.meta.glob("../../views/**/**.vue");
const Layout = () => import("@/layout/index.vue");
export const usePermissionStore = defineStore("permission", () => {
  // 所有路由，包括静态和动态路由
  const routes = ref<RouteRecordRaw[]>([]);
  // 混合模式左侧菜单
  const mixLeftMenus = ref<RouteRecordRaw[]>([]);
  // 路由是否已加载
  const isRoutesLoaded = ref(false);
  /**
   * 生成动态路由
   */
  function generateRoutes() {
    // 返回一个Promise对象，返回类型为RouteRecordRaw[]
    return new Promise<RouteRecordRaw[]>((resolve, reject) => {
      // 调用MenuAPI的getRoutes方法获取路由数据
      MenuAPI.getRoutes()
        .then((data) => {
          // const data: RouteVO[] = [
          //   {
          //     path: "/system",
          //     component: "Layout",
          //     redirect: "/system/user",
          //     name: "/system",
          //     meta: {
          //       title: "系统管理",
          //       icon: "system",
          //       hidden: false,
          //       alwaysShow: false,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "user",
          //         component: "system/user/index",
          //         name: "User",
          //         meta: {
          //           title: "用户管理",
          //           icon: "el-icon-User",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "role",
          //         component: "system/role/index",
          //         name: "Role",
          //         meta: {
          //           title: "角色管理",
          //           icon: "role",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "menu",
          //         component: "system/menu/index",
          //         name: "SysMenu",
          //         meta: {
          //           title: "菜单管理",
          //           icon: "menu",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "dept",
          //         component: "system/dept/index",
          //         name: "Dept",
          //         meta: {
          //           title: "部门管理",
          //           icon: "tree",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "dict",
          //         component: "system/dict/index",
          //         name: "Dict",
          //         meta: {
          //           title: "字典管理",
          //           icon: "dict",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "log",
          //         component: "system/log/index",
          //         name: "Log",
          //         meta: {
          //           title: "系统日志",
          //           icon: "document",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "dict-data",
          //         component: "system/dict/data",
          //         name: "DictData",
          //         meta: {
          //           title: "字典数据",
          //           icon: "",
          //           hidden: true,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "config",
          //         component: "system/config/index",
          //         name: "Config",
          //         meta: {
          //           title: "系统配置",
          //           icon: "setting",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "notice",
          //         component: "system/notice/index",
          //         name: "Notice",
          //         meta: {
          //           title: "通知公告",
          //           icon: "",
          //           hidden: false,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/codegen",
          //     component: "Layout",
          //     name: "/codegen",
          //     meta: {
          //       title: "系统工具",
          //       icon: "menu",
          //       hidden: false,
          //       alwaysShow: false,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "codegen",
          //         component: "codegen/index",
          //         name: "Codegen",
          //         meta: {
          //           title: "代码生成",
          //           icon: "code",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/api",
          //     component: "Layout",
          //     name: "/api",
          //     meta: {
          //       title: "接口文档",
          //       icon: "api",
          //       hidden: false,
          //       alwaysShow: true,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "apifox",
          //         component: "demo/api/apifox",
          //         name: "Apifox",
          //         meta: {
          //           title: "Apifox",
          //           icon: "api",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/doc",
          //     component: "Layout",
          //     redirect: "https://juejin.cn/post/7228990409909108793",
          //     name: "/doc",
          //     meta: {
          //       title: "平台文档",
          //       icon: "document",
          //       hidden: false,
          //       alwaysShow: false,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "internal-doc",
          //         component: "demo/internal-doc",
          //         name: "InternalDoc",
          //         meta: {
          //           title: "document",
          //           icon: "document",
          //           hidden: false,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "https://juejin.cn/post/7228990409909108793",
          //         name: "Https://juejin.cn/post/7228990409909108793",
          //         meta: {
          //           title: "平台文档(外链)",
          //           icon: "link",
          //           hidden: false,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/multi-level",
          //     component: "Layout",
          //     name: "/multiLevel",
          //     meta: {
          //       title: "多级菜单",
          //       icon: "cascader",
          //       hidden: false,
          //       alwaysShow: true,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "multi-level1",
          //         component: "demo/multi-level/level1",
          //         name: "MultiLevel1",
          //         meta: {
          //           title: "菜单一级",
          //           icon: "",
          //           hidden: false,
          //           alwaysShow: true,
          //           params: null,
          //         },
          //         children: [
          //           {
          //             path: "multi-level2",
          //             component: "demo/multi-level/children/level2",
          //             name: "MultiLevel2",
          //             meta: {
          //               title: "菜单二级",
          //               icon: "",
          //               hidden: false,
          //               alwaysShow: false,
          //               params: null,
          //             },
          //             children: [
          //               {
          //                 path: "multi-level3-1",
          //                 component: "demo/multi-level/children/children/level3-1",
          //                 name: "MultiLevel31",
          //                 meta: {
          //                   title: "菜单三级-1",
          //                   icon: "",
          //                   hidden: false,
          //                   keepAlive: true,
          //                   alwaysShow: false,
          //                   params: null,
          //                 },
          //               },
          //               {
          //                 path: "multi-level3-2",
          //                 component: "demo/multi-level/children/children/level3-2",
          //                 name: "MultiLevel32",
          //                 meta: {
          //                   title: "菜单三级-2",
          //                   icon: "",
          //                   hidden: false,
          //                   keepAlive: true,
          //                   alwaysShow: false,
          //                   params: null,
          //                 },
          //               },
          //             ],
          //           },
          //         ],
          //       },
          //     ],
          //   },
          //   {
          //     path: "/component",
          //     component: "Layout",
          //     name: "/component",
          //     meta: {
          //       title: "组件封装",
          //       icon: "menu",
          //       hidden: false,
          //       alwaysShow: false,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "curd",
          //         component: "demo/curd/index",
          //         name: "Curd",
          //         meta: {
          //           title: "增删改查",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "table-select",
          //         component: "demo/table-select/index",
          //         name: "TableSelect",
          //         meta: {
          //           title: "列表选择器",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "wang-editor",
          //         component: "demo/wang-editor",
          //         name: "WangEditor",
          //         meta: {
          //           title: "富文本编辑器",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "upload",
          //         component: "demo/upload",
          //         name: "Upload",
          //         meta: {
          //           title: "图片上传",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "dict-demo",
          //         component: "demo/dictionary",
          //         name: "DictDemo",
          //         meta: {
          //           title: "字典组件",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "icon-selector",
          //         component: "demo/icon-selector",
          //         name: "IconSelector",
          //         meta: {
          //           title: "图标选择器",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/route-param",
          //     component: "Layout",
          //     name: "/routeParam",
          //     meta: {
          //       title: "路由参数",
          //       icon: "el-icon-ElementPlus",
          //       hidden: false,
          //       alwaysShow: true,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "route-param-type1",
          //         component: "demo/route-param",
          //         name: "RouteParamType1",
          //         meta: {
          //           title: "参数(type=1)",
          //           icon: "el-icon-Star",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: {
          //             type: "1",
          //           },
          //         },
          //       },
          //       {
          //         path: "route-param-type2",
          //         component: "demo/route-param",
          //         name: "RouteParamType2",
          //         meta: {
          //           title: "参数(type=2)",
          //           icon: "el-icon-StarFilled",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: {
          //             type: "2",
          //           },
          //         },
          //       },
          //     ],
          //   },
          //   {
          //     path: "/function",
          //     component: "Layout",
          //     name: "/function",
          //     meta: {
          //       title: "功能演示",
          //       icon: "menu",
          //       hidden: false,
          //       alwaysShow: false,
          //       params: null,
          //     },
          //     children: [
          //       {
          //         path: "icon-demo",
          //         component: "demo/icons",
          //         name: "IconDemo",
          //         meta: {
          //           title: "Icons",
          //           icon: "el-icon-Notification",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "/function/websocket",
          //         component: "demo/websocket",
          //         name: "/function/websocket",
          //         meta: {
          //           title: "Websocket",
          //           icon: "",
          //           hidden: false,
          //           keepAlive: true,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //       {
          //         path: "other/:id",
          //         component: "demo/other",
          //         name: "Other/:id",
          //         meta: {
          //           title: "敬请期待...",
          //           icon: "",
          //           hidden: false,
          //           alwaysShow: false,
          //           params: null,
          //         },
          //       },
          //     ],
          //   },
          // ];
          console.log("查询菜单接口获取菜单数据", data);
          // 调用transformRoutes函数处理获取到的路由数据
          const dynamicRoutes = transformRoutes(data);
          // 将处理后的动态路由与常量路由合并
          routes.value = constantRoutes.concat(dynamicRoutes);
          // 设置isRoutesLoaded为true，表示路由已加载完成
          isRoutesLoaded.value = true;
          // 调用resolve函数，将动态路由作为返回值
          resolve(dynamicRoutes);
        })
        .catch((error) => {
          // 捕获异常，调用reject函数并传递错误信息
          reject(error);
        });
    });
  }
  /**
   * 混合模式菜单下根据顶部菜单路径设置左侧菜单
   *
   * @param topMenuPath - 顶部菜单路径
   */
  const setMixLeftMenus = (topMenuPath: string) => {
    const matchedItem = routes.value.find((item) => item.path === topMenuPath);
    if (matchedItem && matchedItem.children) {
      mixLeftMenus.value = matchedItem.children;
    }
  };
  /**
   * 重置路由
   */
  const resetRouter = () => {
    // 删除动态路由，保留静态路由
    routes.value.forEach((route) => {
      if (route.name && !constantRoutes.find((r) => r.name === route.name)) {
        // 从 router 实例中移除动态路由
        router.removeRoute(route.name);
      }
    });
    routes.value = [];
    mixLeftMenus.value = [];
    isRoutesLoaded.value = false;
  };
  return {
    routes,
    generateRoutes,
    mixLeftMenus,
    setMixLeftMenus,
    isRoutesLoaded,
    resetRouter,
  };
});
/**
 * 转换路由数据为组件
 */
const transformRoutes = (routes: RouteVO[]) => {
  const asyncRoutes: RouteRecordRaw[] = [];
  routes.forEach((route) => {
    const tmpRoute = { ...route } as RouteRecordRaw;
    // 顶级目录，替换为 Layout 组件
    if (tmpRoute.component?.toString() == "Layout") {
      tmpRoute.component = Layout;
    } else {
      // 其他菜单，根据组件路径动态加载组件
      const component = modules[`../../views/${tmpRoute.component}.vue`];
      if (component) {
        tmpRoute.component = component;
      } else {
        tmpRoute.component = modules["../../views/error-page/404.vue"];
      }
    }
    if (tmpRoute.children) {
      tmpRoute.children = transformRoutes(route.children);
    }
    asyncRoutes.push(tmpRoute);
  });
  return asyncRoutes;
};
/**
 * 在组件外使用 Pinia store 实例 @see https://pinia.vuejs.org/core-concepts/outside-component-usage.html
 */
export function usePermissionStoreHook() {
  return usePermissionStore(store);
}
